#include <stdio.h>
#include <omp.h>
#include <Windows.h>
int main(void) { 
    // 使用系统的最大线程数，假设系统为单插槽，线程数为 8
    omp_set_nested(1); // 启用嵌套并行
    omp_set_max_active_levels(2); // 设置最大活动级别为 2
    // API call-- Displays Affinity of Primary Thread
    omp_display_affinity(NULL);

    // 第一个并行区域
    #pragma omp parallel num_threads(omp_get_num_procs()) // 使用所有可用的处理器核心
    {
        if(omp_get_thread_num() == 0)
            printf("1st Parallel Region -- Affinity Reported\n");
        // 输出每个线程的亲和性信息
        printf("level %d thread 0x%lx affinity %d-%d\n",
               omp_get_team_num(),
               omp_get_thread_num(),
               omp_get_thread_num() * 2, // 假设系统有8个核心，每个线程对应一对核心
               (omp_get_thread_num() * 2) + 1);
    }

    // 第二个并行区域，检查相同的亲和性
    #pragma omp parallel num_threads(omp_get_num_procs()) // 使用所有可用的处理器核心
    {
        if(omp_get_thread_num() == 0)
            printf("Same Affinity as in Previous Parallel Region -- no Affinity Reported\n");

        // 输出每个线程的亲和性信息
        printf("level %d thread 0x%lx affinity %d-%d\n",
               omp_get_team_num(),
               omp_get_thread_num(),
               omp_get_thread_num() * 2, // 假设系统有8个核心，每个线程对应一对核心
               (omp_get_thread_num() * 2) + 1);
    }
    // 第三个并行区域，报告使用一半线程时的亲和性
    #pragma omp parallel num_threads(omp_get_num_procs()/2) // 使用一半线程数
    {
        if(omp_get_thread_num() == 0)
            printf("Report Affinity for using 1/2 of max threads.\n");
        // 输出每个线程的亲和性信息
        printf("level %d thread 0x%lx affinity %d-%d\n",
               omp_get_team_num(),
               omp_get_thread_num(),
               omp_get_thread_num() * 2, // 假设系统有8个核心，每个线程对应一对核心
               (omp_get_thread_num() * 2) + 1);
    }
    return 0;
}
